package com.mxcyk.org.插件.截屏;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.swing.*;

final public class Screenshot extends JFrame implements MouseMotionListener,
		MouseListener {
	private static final long serialVersionUID = 1L;
	private BufferedImage buff_img;
	private Robot robot;
	private JLabel label;
	private Point start;
	private Point end;
	private int x, y, width, height;
	private boolean over = false;
	private JLabel show_sub;
	private CaptureScreen captureScreen;
	private ImageIcon icon;
	private SubImgAction subAction;
	private JFrame ss = this;

	class SubImgAction implements MouseListener, MouseMotionListener {

		private JLabel label;
		private int x;
		private int y;
		private BufferedImage image;
		private ImageIcon icon;

		public SubImgAction(JLabel label, BufferedImage image, ImageIcon icon) {
			this.label = label;
			this.image = image;
			this.icon = icon;
		}

		@Override
		public void mouseDragged(MouseEvent e) {
			Point dragPoint = e.getPoint();
			SwingUtilities.convertPointToScreen(dragPoint, label);
			icon.setImage(image.getSubimage(dragPoint.x - x < 0 ? 0
					: dragPoint.x - x, dragPoint.y - y < 0 ? 0 : dragPoint.y
					- y, label.getWidth(), label.getHeight()));
			label.setLocation(dragPoint.x - x, dragPoint.y - y);
		}

		@Override
		public void mouseMoved(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseClicked(MouseEvent e) {
			if (e.getButton() == 1 && e.getClickCount() == 2) {
				new ClipboardUtil().writeToClipboard(image.getSubimage(
						label.getX(), label.getY(), label.getWidth(),
						label.getHeight()));
				ss.dispose();
				JOptionPane.showMessageDialog(ss, "指定区域屏幕已复制到剪贴板！");
				captureScreen.setVisible(true);
			} else if (e.getButton() == 3) {
				ss.dispose();
				captureScreen.setVisible(true);
			}
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub

		}

		@Override
		public void mousePressed(MouseEvent e) {
			if (e.getButton() == 3) {
				ss.dispose();
				captureScreen.setVisible(true);
			}
			Point clickPoint = new Point(e.getPoint());
			SwingUtilities.convertPointToScreen(clickPoint, label);
			x = clickPoint.x - label.getX();
			y = clickPoint.y - label.getY();
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub

		}

	}

	public Screenshot(CaptureScreen captureScreen) {
		this.setLayout(null);
		this.captureScreen = captureScreen;
		icon = new ImageIcon();
		this.setSize(ScreanSizeUtil.getDimension());
		setUndecorated(true);
		setExtendedState(MAXIMIZED_BOTH);
		setResizable(false);// 设置不可改变大小
		setAlwaysOnTop(true);// 设置总是在顶层(最上层)
		start = new Point();
		end = new Point();
		label = new JLabel();
		show_sub = new JLabel();
		show_sub.setIcon(icon);

		add(show_sub);
		try {
			robot = new Robot();
			buff_img = robot.createScreenCapture(new Rectangle(0, 0,
					ScreanSizeUtil.getDimension().width, ScreanSizeUtil
							.getDimension().height));// 获得整个屏幕

			subAction = new SubImgAction(show_sub, buff_img, icon);
			show_sub.addMouseListener(subAction);
			show_sub.addMouseMotionListener(subAction);
			show_sub.setBorder(BorderFactory.createLineBorder(Color.RED, 2));

			label = new JLabel() {
				private static final long serialVersionUID = 1L;

				protected void paintComponent(Graphics g) {
					super.paintComponent(g);
					g.drawImage(buff_img, 0, 0, this);
					Graphics2D g2d = (Graphics2D) g;
					g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_ON);
					g2d.setColor(new Color(150, 150, 150));
					AlphaComposite composite = AlphaComposite.getInstance(
							AlphaComposite.SRC_OVER, 60 / 100.0F);
					g2d.setComposite(composite);
					g2d.fill(new RoundRectangle2D.Float(0, 0, this.getWidth(),
							this.getHeight(), 0, 0));
				}
			};
			label.setBounds(0, 0, getWidth(), this.getHeight());
			add(label);
		} catch (AWTException e) {
			e.printStackTrace();
		}

		setVisible(true);
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		robot.createScreenCapture(new Rectangle(0, 0, ScreanSizeUtil
				.getDimension().width, ScreanSizeUtil.getDimension().height));
		addMouseListener(this);
		addMouseMotionListener(this);
	}

	@Override
	public void mouseClicked(MouseEvent e) {

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent e) {
		start.x = e.getX();
		start.y = e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		over = true;
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		if (!over) {
			end.x = e.getX();
			end.y = e.getY();
			x = Math.min(start.x, end.x);
			y = Math.min(start.y, end.y);
			width = Math.abs(end.x - start.x);
			height = Math.abs(end.y - start.y);
			if (width == 0 || height == 0)
				return;
			icon.setImage(buff_img.getSubimage(x, y, width, height));
			show_sub.setBounds(x, y, width, height);
			// repaint();
		}
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		end.x = e.getX();
		end.y = e.getY();
		// repaint();
	}
}